package com.zgis.module.db.util;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.zgis.module.bas.bean.CxEntity;
import com.zgis.module.bas.bean.CxFld;
import com.zgis.module.bas.bean.CxGeom;
import com.zgis.module.bas.bean.CxPro;
import com.zgis.module.bas.constant.CxConsts;
import com.zgis.module.bas.constant.CxKeys;
import com.zgis.module.bas.util.CxDate;

import java.math.BigDecimal;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 修改记录:
 * 24-09-29     zhengchaojun             解决SimpleDateFormat线程安全问题
 */

/**
 * 参数处理
 */
public class CxParam
{
    /**
     * 取请求参数里面某个参数的值
     * @param params 所有请求参数
     * @param key    Key
     * @return 参数值
     * @throws Exception 异常
     */
    public static String getStr(JsonNode params, String key) throws Exception
    {
        String value;

        if (!params.has(key))
            return null;
        value = params.get(key).asText();
        if (value.compareToIgnoreCase(CxConsts.$null) == 0)
            return null;
        return value;
    }

    /**
     * 取请求参数里面某个参数的值
     * @param params 所有请求参数
     * @param key    Key
     * @param defVal 默认值
     * @return 参数值
     * @throws Exception 异常
     */
    public static String getStr(JsonNode params, String key, String defVal) throws Exception
    {
        String value;

        if (!params.has(key))
            return defVal;
        value = params.get(key).asText();
        if (value.compareToIgnoreCase(CxConsts.$null) == 0)
            return defVal;
        return value;
    }

    /**
     * 从参数里面读取 String
     * @param params 所有请求参数
     * @param key    key
     * @param defval 默认值
     * @return
     * @throws Exception
     */
    public static String getString(Map<String, Object> params, String key, String defval)
    {
        Object value = params.get(key);
        if (value != null)
            return value + "";
        else
            return defval;
    }

//    /**
//     * 取请求参数里面某个参数的值并转为JSON类型字符串
//     * @param params 所有请求参数
//     * @param key    Key
//     * @return json字符串
//     * @throws Exception 异常
//     */
//    public static String getJsonStr(JsonNode params, String key) throws Exception
//    {
//        if (!params.has(key))
//            return null;
//
//        return CxJson.toString(params.get(key));
//    }
//
//    /**
//     * 取请求参数里面某个参数
//     * @param params 所有请求参数
//     * @param key    Key
//     * @return 参数
//     * @throws Exception 异常
//     */
//    public static JsonNode getJson(JsonNode params, String key) throws Exception
//    {
//        if (!params.has(key))
//            return null;
//
//        return params.get(key);
//    }
//
//    /**
//     * 将请求参数封装成sql格式返回
//     * @param params args: "id:@:3:@:0:@:1;no:@:3:@:0:@:1"
//     *               argstype: "1,1"
//     * @return sql
//     * @throws Exception 异常
//     */
//    public static ObjectNode parseArgs(JsonNode params) throws Exception
//    {
//        ObjectNode          jo          = CxJson.objectNode();
//        String              sqlt1       = "";
//        Map<String, Object> values      = new HashMap<>();
//        String              strArgs     = getStr(params, CxKeys.args);            //服务调用传的 SQL参数
//        String              strArgsType = getStr(params, CxKeys.argstype);    //服务调用传的 SQL参数的类型
//        int                 i;
//
//        if (strArgs != null && strArgsType != null)
//        {
//            String   sqlt2;
//            String[] arrArgs     = strArgs.split(CxConsts.SIMICOLON);
//            String[] arrTypeArgs = strArgsType.split(CxConsts.defSep);
//            String[] arrArg;
//            int      typeS;
//            int      oper, conc;
//            int      paraNum     = 0;
//
//            for (i = 0; i < arrArgs.length; i++)
//            {
//                typeS = Integer.parseInt(arrTypeArgs[i]);
//                arrArg = arrArgs[i].split(CxConsts.conSep);
//                sqlt2 = "";
//
//                //操作符
//                oper = Integer.parseInt(arrArg[1]);
//                switch (oper)
//                {
//                    case 1:
//                        arrArg[1] = "=";
//                        break;
//                    case 2:
//                        arrArg[1] = "!=";
//                        break;
//                    case 3:
//                        arrArg[1] = ">";
//                        break;
//                    case 4:
//                        arrArg[1] = ">=";
//                        break;
//                    case 5:
//                        arrArg[1] = "<";
//                        break;
//                    case 6:
//                        arrArg[1] = "<=";
//                        break;
//                    case 7:
//                        arrArg[1] = " LIKE ";
//                        break;
//                    case 8:
//                        arrArg[1] = " IS NULL";
//                        break;
//                    case 9:
//                        arrArg[1] = " IS NOT NULL";
//                        break;
//                    case 10:
//                        arrArg[1] = " IN";
//                        break;
//                    default:
//                        throw new Exception(CxErrors.errParam + CxConsts.MINUS + oper);
//                }
//
//                //连接符
//                conc = Integer.parseInt(arrArg[3]);
//                switch (conc)
//                {
//                    case 1:
//                        arrArg[3] = " AND ";
//                        break;
//                    case 2:
//                        arrArg[3] = " OR ";
//                        break;
//                    default:
//                        arrArg[3] = "";
//                        break;
//                }
//
//                //拼 列 + 操作符 + 值
//                switch (oper)
//                {
//                    case 1:
//                    case 2:
//                    case 3:
//                    case 4:
//                    case 5:
//                    case 6:
//                    case 7:
//                        sqlt2 = arrArg[0] + arrArg[1] + "#{values." + paraNum + "}";                //col = #{values.n}
//                        CxParam.paramsObj(values, "" + paraNum, typeS, arrArg[2].compareToIgnoreCase(CxConsts.$null) == 0 ? null : arrArg[2]);
//                        paraNum++;
//                        break;
//                    case 8:
//                    case 9:
//                        sqlt2 = arrArg[0] + arrArg[1];                                                //col IS NULL
//                        break;
//                    case 10:
//                        sqlt2 = arrArg[0] + arrArg[1] + "(" + SqlUtil.paramIn(arrArg[2]) + ")";        //col IN('***','***')
//                        break;
//                }
//                //拼连接符
//                if (i == 0)
//                    sqlt1 += sqlt2;
//                else
//                {
//                    if (conc != 1 && conc != 2)
//                        throw new Exception(CxErrors.errParam + CxConsts.MINUS + conc);
//                    sqlt1 += arrArg[3] + sqlt2;
//                }
//            }
//        }
//        jo.put(CxKeys.exp, sqlt1);
//        jo.putPOJO(CxKeys.data, values);
//        return jo;
//    }
//
    /**
     * 从参数里面读取 Int
     * @param params 所有请求参数
     * @param key    Key
     * @param defVal 默认值
     * @return int
     * @throws Exception 异常
     */
    public static int getInt(JsonNode params, String key, int defVal) throws Exception
    {
        String value;

        if (!params.has(key))
            return defVal;
        value = params.get(key).asText();
        if (value.compareToIgnoreCase(CxConsts.$null) == 0)
            return defVal;
        if (value.isEmpty())
            return defVal;
        return Integer.parseInt(value);
    }

    /**
     * 从参数里面读取 Int
     * @param params 所有请求参数
     * @param key    Key
     * @param defval 默认值
     * @return Int值
     * @throws Exception 异常
     */
    public static int getInt(Map<String, Object> params, String key, int defval) throws Exception
    {
        Object value = params.get(key);
        if (value instanceof Integer)
        {
            if (value != null)
                return Integer.parseInt(value + "");
            else
                return defval;
        }
        else if (value instanceof BigDecimal)
        {
            if (value != null)
                return ((BigDecimal) value).intValue();
            else
                return defval;
        }

        return defval;

    }

//    /**
//     * 从参数里面读取 Double
//     * @param params 所有请求参数
//     * @param key    Key
//     * @param defVal 默认值
//     * @return double
//     * @throws Exception 异常
//     */
//    public static double getDouble(JsonNode params, String key, double defVal)
//    {
//        String value;
//
//        if (!params.has(key))
//            return defVal;
//        value = params.get(key).asText();
//        if (value.compareToIgnoreCase(CxConsts.$null) == 0)
//            return defVal;
//        if (value.isEmpty())
//            return defVal;
//        return Double.parseDouble(value);
//    }
//
//    /**
//     * 从参数里面读取 Double
//     * @param params 所有请求参数
//     * @param key    Key
//     * @param defval 默认值
//     * @return Double值
//     */
//    public static double getDouble(Map<String, Object> params, String key, double defval)
//    {
//        Object value = params.get(key);
//        if (value instanceof Double)
//        {
//            if (value != null)
//                return Double.parseDouble(value + "");
//            else
//                return defval;
//        }
//        else if (value instanceof BigDecimal)
//        {
//            if (value != null)
//                return ((BigDecimal) value).doubleValue();
//            else
//                return defval;
//        }
//
//        return defval;
//    }

    /**
     * 从参数里面读取 Id
     * @param values 所有请求参数
     * @return Id
     * @throws Exception 异常
     */
    public static int getId(Map<String, Object> values) throws Exception
    {
        return values.containsKey(CxKeys.id) ? Integer.parseInt(values.get(CxKeys.id) + "") : 0;
    }

    /**
     * 从参数里面读取 Id
     * @param params 所有请求参数
     * @return Id
     * @throws Exception 异常
     */
    public static int getId(JsonNode params) throws Exception
    {
        return params.has(CxKeys.id) ? params.get(CxKeys.id).asInt() : 0;
    }

    /**
     * 从实体获取表名
     * @param entity 实体对象
     * @return 表名
     */
    public static String getTable(CxEntity entity)
    {
        return entity.getName();
    }

    /**
     * 获取空间查询语句
     * @param dbId   数据库类型
     * @param srid   投影代号
     * @param params 请求参数
     * @return 空间查询语句
     * @throws Exception 异常
     */
    public static String getSpatialQuery(String dbId, int srid, JsonNode params) throws Exception
    {
        String coor = params.has(CxKeys.geom) ? params.get(CxKeys.geom).toString() : null;
        String r    = params.has(CxKeys.r) ? params.get(CxKeys.r).asText() : null;

        if (coor != null && !coor.isEmpty())
        {
            CxGeom g = new CxGeom(dbId, srid, coor);

            if (r != null && !r.equals(CxConsts.V0) && !r.isEmpty())
                return g.getBufferQuery(g.getBufferGeom(Double.parseDouble(r)), Double.parseDouble(r));
            else
                return g.getRangeQuery(g.getGeom());
        }
        else
            return null;
    }

    /**
     * 获取WKT坐标串
     * @param params 请求参数
     * @param dbId   数据库类型
     * @param srid   投影代号
     * @throws Exception 异常
     */
    public static void getGeomParams(JsonNode params, String dbId, int srid) throws Exception
    {
        String coor = params.has(CxKeys.geom) ? params.get(CxKeys.geom).toString() : null;

        if (coor != null && !coor.isEmpty())
        {
            CxGeom     g  = new CxGeom(dbId, srid, coor);
            ObjectNode jo = (ObjectNode) params;

            jo.put(CxKeys.geom, g.getWKT());
        }
    }

    /**
     * 获取WKT的SQL坐标串
     * @param params 请求参数
     * @param dbId   数据库类型
     * @param srid   投影代号
     * @throws Exception 异常
     */
    public static void getGeomSqlParams(JsonNode params, String dbId, int srid) throws Exception
    {
        String coor = params.has(CxKeys.geom) ? params.get(CxKeys.geom).toString() : null;

        if (coor != null && !coor.isEmpty())
        {
            CxGeom     g  = new CxGeom(dbId, srid, coor);
            ObjectNode jo = (ObjectNode) params;

            jo.put(CxKeys.geom, g.getGeom());
        }
    }

    /**
     * 获取WKT坐标串集合
     * @param params 请求参数
     * @param dbId   数据库类型
     * @param srid   投影代号
     * @throws Exception 异常
     */
    public static void getGeomArrayParams(JsonNode params, String dbId, int srid) throws Exception
    {
        ArrayNode ja = params.has(CxKeys.geom) ? (ArrayNode) params.get(CxKeys.geom) : null;

        if (ja != null)
        {
            int        il   = ja.size();
            ObjectNode jo   = (ObjectNode) params;
            String     wkts = "";
            for (int i = 0; i < il; i++)
            {
                String coor = ja.get(i).toString();

                if (coor != null && !coor.isEmpty())
                {
                    CxGeom g = new CxGeom(dbId, srid, coor);
                    if (i == 0)
                        wkts = g.getWKT();
                    else
                        wkts += "," + g.getWKT();
                }
            }

            jo.put(CxKeys.geom, wkts);
        }
    }

    /**
     * 获取WKT坐标串SQL集合
     * @param params 请求参数
     * @param dbId   数据库类型
     * @param srid   投影代号
     * @throws Exception 异常
     */
    public static void getGeomSqlArrayParams(JsonNode params, String dbId, int srid) throws Exception
    {
        ArrayNode ja = params.has(CxKeys.geom) ? (ArrayNode) params.get(CxKeys.geom) : null;

        if (ja != null)
        {
            int        il   = ja.size();
            ObjectNode jo   = (ObjectNode) params;
            String     wkts = "";
            for (int i = 0; i < il; i++)
            {
                String coor = ja.get(i).toString();

                if (coor != null && !coor.isEmpty())
                {
                    CxGeom g = new CxGeom(dbId, srid, coor);
                    if (i == 0)
                        wkts = g.getGeom();
                    else
                        wkts += "," + g.getGeom();
                }
            }

            jo.put(CxKeys.geom, wkts);
        }
    }

//    /**
//     * 获取点的空间对象
//     * @param params 参数
//     * @param pnt    点
//     * @param dbId   数据库类型
//     * @param srid   投影代号
//     * @throws Exception 异常
//     */
//    public static void getGeoJson(JsonNode params, CxPoint pnt, String dbId, int srid) throws Exception
//    {
//        CxGeom     g  = new CxGeom(dbId, srid, pnt);
//        ObjectNode jo = (ObjectNode) params;
//
//        jo.putPOJO(CxKeys.geom, g.getGeojson());
//    }
//
//    /**
//     * 获取线的空间对象
//     * @param params 参数
//     * @param pnt1   点1
//     * @param pnt2   点2
//     * @param dbId   数据库类型
//     * @param srid   投影代号
//     * @throws Exception 异常
//     */
//    public static void getGeoJson(JsonNode params, CxPoint pnt1, CxPoint pnt2, String dbId, int srid) throws Exception
//    {
//        CxGeom     g  = new CxGeom(dbId, srid, pnt1, pnt2);
//        ObjectNode jo = (ObjectNode) params;
//
//        jo.putPOJO(CxKeys.geom, g.getGeojson());
//    }


    /**
     * 参数转换
     * @param type 参数类型
     * @return int
     * @throws Exception 异常
     */
    public static int getObjType(String type)
    {
        switch (type)
        {
            case "i":
            case "long":
                return CxConsts.DATA_LONG;
            case "r":
            case "double":
                return CxConsts.DATA_DOUBLE;
            case "s":
            case "string":
                return CxConsts.DATA_STRING;
            case "d":
            case "date":
                return CxConsts.DATA_DATE;
            case "t":
            case "datetime":
                return CxConsts.DATA_DATETIME;
            default:
                return 0;
        }
    }

    /**
     * 参数转 数据库绑定对象
     * @param objects 存放对象
     * @param key     key值
     * @param type    参数类型
     * @param value   值
     * @throws Exception 异常
     */
    public static void paramsObj(Map<String, Object> objects, String key, int type, String value) throws Exception
    {
        Object obj;

        obj = null;
        if (value != null && value.length() != 0)
        {
            switch (type)
            {
                case CxConsts.DATA_LONG:
                    obj = new Integer(Integer.parseInt(value));
                    break;
                case CxConsts.DATA_DOUBLE:
                    obj = new Double(Double.parseDouble(value));
                    break;
                case CxConsts.DATA_STRING:
                    obj = value;
                    break;
                case CxConsts.DATA_DATE:
//                    obj = new java.sql.Date(CxDate.parse(value).getTime());
                    break;
                case CxConsts.DATA_DATETIME:
//                    obj = new java.sql.Timestamp(CxTime.parse(value).getTime());
                    break;
            }
        }
        objects.put(key, obj);
    }

    /**
     * 参数转 数据库绑定对象
     * @param objects 存放对象
     * @param key     key值
     * @param type    参数类型
     * @param value   值
     * @throws Exception 异常
     */
    public static void paramsObj(Map<String, Object> objects, String key, String type, String value) throws Exception
    {
        Object obj;

        obj = null;
        if (value != null && value.length() != 0)
        {
            switch (type)
            {
                case "i":
                case "long":
                    obj = new Integer(Integer.parseInt(value));
                    break;
                case "r":
                case "double":
                    obj = new Double(Double.parseDouble(value));
                    break;
                case "s":
                case "string":
                    obj = value;
                    break;
                case "d":
                case "date":
//                    obj = new java.sql.Date(CxDate.parse(value).getTime());
                    break;
                case "t":
                case "datetime":
//                    obj = new java.sql.Timestamp(CxTime.parse(value).getTime());
                    break;
            }
        }
        objects.put(key, obj);
    }

    /**
     * 参数转 数据库绑定对象
     * @param objects 存放对象
     * @param paraNum 参数个数
     * @param types   参数类型数组
     * @param values  值数组
     * @throws Exception 异常
     */
    public static void paramsObj(List<CxPro> objects, int paraNum, String[] types, String[] values) throws Exception
    {
        CxPro  obj;
        String value;

        for (int i = 0; i < paraNum; i++)
        {
            obj = new CxPro();
            value = values[i];
            if (value != null && value.length() != 0)
            {
                switch (types[i])
                {
                    case "i":
                    case "long":
                        obj.jdbcType = "INTEGER";
                        obj.value = new Integer(Integer.parseInt(value));
                        break;
                    case "r":
                    case "double":
                        obj.jdbcType = "DOUBLE";
                        obj.value = new Double(Double.parseDouble(value));
                        break;
                    case "s":
                    case "string":
                        obj.jdbcType = "VARCHAR";
                        obj.value = value;
                        break;
                    case "d":
                    case "date":
                        obj.jdbcType = "DATE";
//                        obj.value = new java.sql.Date(CxDate.parse(value).getTime());
                        break;
                    case "t":
                    case "datetime":
                        obj.jdbcType = "TIMESTAMP";
//                        obj.value = new java.sql.Timestamp(CxTime.parse(value).getTime());
                        break;
                }
            }
            objects.add(obj);
        }
    }

    /**
     * 参数转 数据库绑定对象
     * @param objects 存放对象
     * @param flds    字段列表
     * @param params  请求参数
     * @throws Exception 异常
     */
    public static void paramsObj(Map<String, Object> objects, List<CxFld> flds, JsonNode params) throws Exception
    {
        Object obj;
        String value;
        CxFld    fld;

        for (int i = 0, fldNum = flds.size(); i < fldNum; i++)
        {
            fld = flds.get(i);
            if (!params.has(fld.getColname()))                   //如果没有传值的话，该字段不要
                continue;
            value = params.get(fld.getColname()).asText();
            obj = null;
            if (value != null && value.length() != 0)
            {
                switch (3)
                {
                    case CxConsts.DATA_LONG:
                        obj = new Integer(Integer.parseInt(value));
                        break;
                    case CxConsts.DATA_DOUBLE:
                        obj = new Double(Double.parseDouble(value));
                        break;
                    case CxConsts.DATA_STRING:
                        obj = value;
                        break;
                    case CxConsts.DATA_DATE:
//                        obj = new java.sql.Date(CxDate.parse(value).getTime());
                        break;
                    case CxConsts.DATA_DATETIME:
//                        obj = new java.sql.Timestamp(CxTime.parse(value).getTime());
                        break;
                }
            }
            objects.put(fld.getColname(), obj);
        }
    }

    /**
     * 参数转 数据库绑定对象
     * @param objects 存放对象
     * @param flds    字段列表
     * @param params  请求参数
     * @throws Exception 异常
     */
    public static void paramsObj(Map<String, Object> objects, List<CxFld> flds, Map<String, String> params) throws Exception
    {
        Object obj;
        String value;
        CxFld    fld;

        for (int i = 0, fldNum = flds.size(); i < fldNum; i++)
        {
            fld = flds.get(i);
            if (!params.containsKey(fld.getColname()))               //如果没有传值的话，该字段不要
                continue;
            value = params.get(fld.getColname());
            obj = null;
            if (value != null && value.length() != 0)
            {
                switch (fld.getDisptype())
                {
                    case CxConsts.DATA_LONG:
                        obj = new Integer(Integer.parseInt(value));
                        break;
                    case CxConsts.DATA_DOUBLE:
                        obj = new Double(Double.parseDouble(value));
                        break;
                    case CxConsts.DATA_STRING:
                        obj = value;
                        break;
                    case CxConsts.DATA_DATE:
//                        obj = new java.sql.Date(CxDate.parse(value).getTime());
                        break;
                    case CxConsts.DATA_DATETIME:
//                        obj = new java.sql.Timestamp(CxTime.parse(value).getTime());
                        break;
                }
            }
            objects.put(fld.getColname(), obj);
        }
    }

    /**
     * 参数转 数据库绑定对象 (根据cols 绑定一条数据)
     * @param objects 存放对象
     * @param flds    字段列表
     * @param cols    字段列表(,号分隔)
     * @param params  请求参数
     * @throws Exception 异常
     */
    public static void paramsObj(Map<String, Object> objects, List<CxFld> flds, String cols, JsonNode params) throws Exception
    {
        Object obj;
        String value;
        CxFld  fld;
        int    i, num;

        if (cols != null && cols.length() > 0)
        {
            String[] arrCols = cols.split(CxConsts.defSep);

            num = arrCols.length;
            for (i = 0; i < num; i++)
            {
                // 从字段列表中查找对应的字段
                fld = null;
                for (CxFld f : flds)
                {
                    if (f.getColname().equals(arrCols[i]))
                    {
                        fld = f;
                        break;
                    }
                }
                if (fld == null)
                    throw new Exception(arrCols[i] + " column is't exist!");
                if (!params.has(fld.getColname()))                   //如果没有传值的话，该字段不要
                    continue;
                value = params.get(fld.getColname()).asText();
                obj = null;
                if (value != null && value.length() != 0)
                {
                    switch (fld.getDisptype())
                    {
                        case CxConsts.DATA_LONG:
                            obj = new Integer(Integer.parseInt(value));
                            break;
                        case CxConsts.DATA_DOUBLE:
                            obj = new Double(Double.parseDouble(value));
                            break;
                        case CxConsts.DATA_STRING:
                            obj = value;
                            break;
                        case CxConsts.DATA_DATE:
//                            obj = new java.sql.Date(CxDate.parse(value).getTime());
                            break;
                        case CxConsts.DATA_DATETIME:
//                            obj = new java.sql.Timestamp(CxTime.parse(value).getTime());
                            break;
                    }
                }
                objects.put(fld.getColname(), obj);
            }
        }
        else
        {
            num = flds.size();
            for (i = 0; i < num; i++)
            {
                fld = flds.get(i);
                if (!params.has(fld.getColname()))                   //如果没有传值的话，该字段不要
                    continue;
                value = params.get(fld.getColname()).asText();
                obj = null;
                if (value != null && value.length() != 0)
                {
                    switch (fld.getDisptype())
                    {
                        case CxConsts.DATA_LONG:
                            obj = new Integer(Integer.parseInt(value));
                            break;
                        case CxConsts.DATA_DOUBLE:
                            obj = new Double(Double.parseDouble(value));
                            break;
                        case CxConsts.DATA_STRING:
                            obj = value;
                            break;
                        case CxConsts.DATA_DATE:
//                            obj = new java.sql.Date(CxDate.parse(value).getTime());
                            break;
                        case CxConsts.DATA_DATETIME:
//                            obj = new java.sql.Timestamp(CxTime.parse(value).getTime());
                            break;
                    }
                }
                objects.put(fld.getColname(), obj);
            }
        }
    }

    /**
     * 参数转 数据库绑定对象 (根据cols 绑定多条数据)
     * @param objects 存放对象
     * @param flds    字段列表
     * @param cols    字段列表(,号分隔)
     * @param params  请求参数
     * @throws Exception 异常
     */
    public static void paramsObj(List<Map<String, Object>> objects, List<CxFld> flds, String cols, JsonNode params) throws Exception
    {
        String              sep    = CxParam.getStr(params, CxKeys.separator);
        int                 rcdNum = CxParam.getInt(params, CxKeys._rcdnum, 0);
        Map<String, Object> map;
        Object              obj;
        String              value;
        String[]            arrVal;
        CxFld               fld;
        int                 i, j, num;

        //先把对象都分配好
        for (i = 0; i < rcdNum; i++)
        {
            map = new HashMap<>();
            objects.add(map);
        }

        if (sep == null || sep.isEmpty())
            sep = CxConsts.defSep;

        if (cols != null && cols.length() > 0)
        {
            String[] arrCols = cols.split(CxConsts.defSep, -1);

            num = arrCols.length;
            for (i = 0; i < num; i++)
            {
                // 从字段列表中查找对应的字段
                fld = null;
                for (CxFld f : flds)
                {
                    if (f.getColname().equals(arrCols[i]))
                    {
                        fld = f;
                        break;
                    }
                }
                if (fld == null)
                    throw new Exception(arrCols[i] + " column is't exist!");
                if (!params.has(fld.getColname()))                   //如果没有传值的话，该字段不要
                    continue;
                value = params.get(fld.getColname()).asText();
                arrVal = value.split(sep, -1);
                for (j = 0; j < rcdNum; j++)
                {
                    map = objects.get(j);
                    value = arrVal[j];
                    if (value != null && (value.length() == 0 || value.equalsIgnoreCase(CxConsts.$null)))
                        value = null;
                    obj = null;
                    if (value != null && value.length() != 0)
                    {
                        switch (fld.getDisptype())
                        {
                            case CxConsts.DATA_LONG:
                                obj = new Integer(Integer.parseInt(value));
                                break;
                            case CxConsts.DATA_DOUBLE:
                                obj = new Double(Double.parseDouble(value));
                                break;
                            case CxConsts.DATA_STRING:
                                obj = value;
                                break;
                            case CxConsts.DATA_DATE:
//                                obj = new java.sql.Date(CxDate.parse(value).getTime());
                                break;
                            case CxConsts.DATA_DATETIME:
//                                obj = new java.sql.Timestamp(CxTime.parse(value).getTime());
                                break;
                        }
                    }
                    map.put(fld.getColname(), obj);
                }
            }
        }
        else
        {
            num = flds.size();
            for (i = 0; i < num; i++)
            {
                fld = flds.get(i);
                if (!params.has(fld.getColname()))                   //如果没有传值的话，该字段不要
                    continue;
                value = params.get(fld.getColname()).asText();
                arrVal = value.split(sep, -1);             //-1 不会丢失分隔符后面的空值
                for (j = 0; j < rcdNum; j++)
                {
                    map = objects.get(j);
                    value = arrVal[j];
                    if (value != null && (value.length() == 0 || value.equalsIgnoreCase(CxConsts.$null)))
                        value = null;
                    obj = null;
                    if (value != null && value.length() != 0)
                    {
                        switch (fld.getDisptype())
                        {
                            case CxConsts.DATA_LONG:
                                obj = new Integer(Integer.parseInt(value));
                                break;
                            case CxConsts.DATA_DOUBLE:
                                obj = new Double(Double.parseDouble(value));
                                break;
                            case CxConsts.DATA_STRING:
                                obj = value;
                                break;
                            case CxConsts.DATA_DATE:
//                                obj = new java.sql.Date(CxDate.parse(value).getTime());
                                break;
                            case CxConsts.DATA_DATETIME:
//                                obj = new java.sql.Timestamp(CxTime.parse(value).getTime());
                                break;
                        }
                    }
                    map.put(fld.getColname(), obj);
                }
            }
        }
    }
}
